package ar.uade.distribuidas.tpo.servicios;

import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.joda.time.LocalDate;

import ar.uade.distribuidas.tpo.base.dominiodto.ClienteDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.CondicionDeVentaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.CotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.EstadoItemPedido;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemPedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemSolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDePedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ProveedorDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.SolicitudDeCotizacionDTO;
import ar.uade.distribuidas.tpo.base.utils.FormatUtils;
import ar.uade.distribuidas.tpo.web.delegado.BD;

public class GeneradorVentas {
	
	
	private SolicitudDeCotizacionDTO sc1;
	private SolicitudDeCotizacionDTO sc2;
	private CotizacionDTO c1;
	private CotizacionDTO c2;
	private OrdenDePedidoDTO op2;
	private OrdenDePedidoDTO op1;
	public String xmlCot1;
	public String xmlCot2;
		
	public static void main(String[] args) {
		
		altaPrecondiciones();
		
		SolicitudDeCotizacionDTO sc1 = makeSC1();
		System.out.println("creada la sc1 con el id"+sc1.getId());
		SolicitudDeCotizacionDTO sc2 = makeSC2();
		System.out.println("creada la sc2 con el id"+sc2.getId());

		CotizacionDTO c1 = makeCot(sc1);
		System.out.println("creada la c1 con el id"+c1.getId());
		CotizacionDTO c2 = makeCot(sc2);
		System.out.println("creada la c2 con el id"+c2.getId());
		
		OrdenDePedidoDTO op1 = makeOP(c1.getId());
		System.out.println("creada la op1 con el id"+op1.getNumero());
		OrdenDePedidoDTO op2 = makeOP(c2.getId());
		System.out.println("creada la op2 con el id"+op2.getNumero());
	}

	
	public void altaSCs() {
		sc1 = makeSC1();
		System.out.println("creada la sc1 con el id"+sc1.getId());
		sc2 = makeSC2();
		System.out.println("creada la sc2 con el id"+sc2.getId());
	}
	
	public void altaCots() {
		c1 = makeCot(sc1);
		System.out.println("creada la c1 con el id"+c1.getId());
		c2 = makeCot(sc2);
		System.out.println("creada la c2 con el id"+c2.getId());
		xmlCot1 = new VentasServiceImpl().cotizarSolicitud(c1.getId());
		xmlCot2 = new VentasServiceImpl().cotizarSolicitud(c2.getId());
	}
	
	public void altaOPs() {
		op1 = makeOP(c1.getId());
		System.out.println("creada la op1 con el id"+op1.getNumero());
		op2 = makeOP(c2.getId());
		System.out.println("creada la op2 con el id"+op2.getNumero());
	}

	private static void altaPrecondiciones() {
		//Rodamientos
		RodamientoDTO r1 = new RodamientoDTO(1212, "RS", "NTN", "ARG");
		r1 = getOrSave(r1);
		
		RodamientoDTO r2 = new RodamientoDTO(3535, "SS", "SKF", "SWD");
		r2 = getOrSave(r2);

		RodamientoDTO r3 = new RodamientoDTO(7676, "RT", "NTN", "JAP");
		r3 = getOrSave(r3);
		
		RodamientoDTO r4 = new RodamientoDTO(9889, "ST", "SKF", "USA");
		r4 = getOrSave(r4);
		
		//Proveedores
		ProveedorDTO p1 = new ProveedorDTO();
		p1.setCuil(4444L);
		p1.setNombre("LaRodadora");
		
		p1 = getOrSave(p1);
		
		ProveedorDTO p2 = new ProveedorDTO();
		p2.setCuil(5555L);
		p2.setNombre("Rodamesta");
		
		p2 = getOrSave(p2);
		/*
		//Listas
		ListaPrecioDTO lp1 = new ListaPrecioDTO();
		lp1.setCondicionesDeVenta(Arrays.asList(new CondicionDeVentaDTO()));
		lp1.setDate(new Date());
		lp1.setFechaDesde(new Date());
		lp1.setFechaHasta(new Date());
		lp1.setIdLista(44L);
		lp1.setProveedor(p1);
		
		ListaPrecioDTO lp2 = new ListaPrecioDTO();
		lp2.setCondicionesDeVenta(Arrays.asList(new CondicionDeVentaDTO()));
		lp2.setDate(new Date());
		lp2.setFechaDesde(new Date());
		lp2.setFechaHasta(new Date());
		lp2.setIdLista(55l);
		lp2.setProveedor(p2);
		
		//Items
		ItemListaPrecioDTO ilp1 = new ItemListaPrecioDTO();
		ilp1.setCantidadAsegurada(100);
		ilp1.setCosto(10);
		ilp1.setListaPrecioId(lp1.getIdLista());
		ilp1.setRodamiento(r1);
		
		ItemListaPrecioDTO ilp2 = new ItemListaPrecioDTO();
		ilp2.setCantidadAsegurada(100);
		ilp2.setCosto(10);
		ilp2.setListaPrecioId(lp1.getIdLista());
		ilp2.setRodamiento(r2);
		
		ItemListaPrecioDTO ilp3 = new ItemListaPrecioDTO();
		ilp3.setCantidadAsegurada(100);
		ilp3.setCosto(5);
		ilp3.setListaPrecioId(lp1.getIdLista());
		ilp3.setRodamiento(r1);
		
		ItemListaPrecioDTO ilp4 = new ItemListaPrecioDTO();
		ilp4.setCantidadAsegurada(100);
		ilp4.setCosto(5);
		ilp4.setListaPrecioId(lp1.getIdLista());
		ilp4.setRodamiento(r2);
		
		ItemListaPrecioDTO ilp5 = new ItemListaPrecioDTO();
		ilp5.setCantidadAsegurada(50);
		ilp5.setCosto(10);
		ilp5.setListaPrecioId(lp2.getIdLista());
		ilp5.setRodamiento(r3);
		
		ItemListaPrecioDTO ilp6 = new ItemListaPrecioDTO();
		ilp6.setCantidadAsegurada(5);
		ilp6.setCosto(10);
		ilp6.setListaPrecioId(lp2.getIdLista());
		ilp6.setRodamiento(r4);
		
		lp1.setItems(Arrays.asList(ilp1,ilp2,ilp3,ilp4));
		lp2.setItems(Arrays.asList(ilp5,ilp6));

		lp1 = getOrSave(lp1);
		lp2 = getOrSave(lp2);

		*/
		
	}

	public static OrdenDePedidoDTO makeOP(Long long1) {
		CotizacionDTO c = BD.getInstance().getCotizacion(long1);
		
		OrdenDePedidoDTO op = new OrdenDePedidoDTO();
		op.setCliente(c.getCliente());
		op.setCondicionVenta(c.getCondicionesDeVentaDTO().get(0));
		op.setFecha("2014-01-01");
		op.setNumero(long1);
		List<ItemPedidoDTO> itemsPedido = new LinkedList<ItemPedidoDTO>();
		op.setItemsPedido(itemsPedido );
		
		for(ItemCotizacionDTO ic : c.getItemCotizacionDTO()) {
			ItemPedidoDTO ip = new ItemPedidoDTO();
			ip.setCotizacionId(c.getId());
			ip.setEstado(EstadoItemPedido.PENDIENTE);
			ip.setItemCotizacionId(ic.getId());
			ip.setCantidad(ic.getCantidad());
			
			Long idItemSol = ic.getItemSolicitudId();
			ItemSolicitudDeCotizacionDTO isc = BD.getInstance().getItemSolicitudDeCotizacion(idItemSol);
			ip.setRodamientoId(isc.getRodamiento().getIdRodamiento());
			itemsPedido.add(ip);
		}
		BD.getInstance().altaOrdenDePedido(op);
		
//		System.out.println(xml);
		return BD.getInstance().getOrdenDePedido(long1);
	}

	
	private String cotizar() {
		VentasService ventasService = VentasServiceImpl.getInstancia();
		String xml = "";
		try {
			ClienteDTO c = BD.getInstance().getCliente(12345L);
			xml = ventasService.cotizarSolicitud(15l);
			System.out.println(xml);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return xml;
	}
	
	public static SolicitudDeCotizacionDTO makeSC1() {
		SolicitudDeCotizacionDTO dto = new SolicitudDeCotizacionDTO();
		dto.setId(99L);

		RodamientoDTO r1 = new RodamientoDTO(1212, "RS", "NTN", "ARG");
		r1 = getOrSave(r1);
		
		RodamientoDTO r2 = new RodamientoDTO(3535, "SS", "SKF", "SWD");
		r2 = getOrSave(r2);
		
		CondicionDeVentaDTO cdv = new CondicionDeVentaDTO();
		cdv.setNombre("contado");
		cdv.setPlazo(0);
		cdv.setPorcentaje(20);
		
		List<CondicionDeVentaDTO> condiciones = Arrays.asList(cdv);

		ClienteDTO cliente = new ClienteDTO();
		cliente.setCuil(13579L);
		cliente.setNombre("pepe");
		cliente.setCondiciones(condiciones);
		dto.setCliente(cliente);
		
		cliente = getOrSave(cliente);
		
		dto.setCliente(cliente);
		dto.setFecha((new LocalDate()).toString(FormatUtils.DATE_FORMATTER));
		List<ItemSolicitudDeCotizacionDTO> items = new LinkedList<ItemSolicitudDeCotizacionDTO>();
		dto.setItems(items);
		
		ItemSolicitudDeCotizacionDTO i1 = new ItemSolicitudDeCotizacionDTO();
		i1.setCantidad(1);
		i1.setRodamiento(r1);
		items.add(i1);
		
		ItemSolicitudDeCotizacionDTO i2 = new ItemSolicitudDeCotizacionDTO();
		i2.setCantidad(1);
		i2.setRodamiento(r2);
		items.add(i2);
		
		dto = getOrSave(dto);
		
		return dto;
	}
	
	public static SolicitudDeCotizacionDTO makeSC2() {
		SolicitudDeCotizacionDTO dto = new SolicitudDeCotizacionDTO();
		dto.setId(33L);

		RodamientoDTO r1 = new RodamientoDTO(7676, "RT", "NTN", "JAP");
		r1 = getOrSave(r1);
		
		RodamientoDTO r2 = new RodamientoDTO(9889, "ST", "SKF", "USA");
		r2 = getOrSave(r2);
		
		CondicionDeVentaDTO cdv = new CondicionDeVentaDTO();
		cdv.setNombre("Financiacion");
		cdv.setPlazo(30);
		cdv.setPorcentaje(15);
		
		List<CondicionDeVentaDTO> condiciones = Arrays.asList(cdv);

		ClienteDTO cliente = new ClienteDTO();
		cliente.setCuil(27546L);
		cliente.setNombre("ramon");
		cliente.setCondiciones(condiciones);
		dto.setCliente(cliente);
		
		cliente = getOrSave(cliente);
		
		dto.setCliente(cliente);
		dto.setFecha((new LocalDate()).toString(FormatUtils.DATE_FORMATTER));
		List<ItemSolicitudDeCotizacionDTO> items = new LinkedList<ItemSolicitudDeCotizacionDTO>();
		dto.setItems(items);
		
		ItemSolicitudDeCotizacionDTO i1 = new ItemSolicitudDeCotizacionDTO();
		i1.setCantidad(10);
		i1.setRodamiento(r1);
		items.add(i1);
		
		ItemSolicitudDeCotizacionDTO i2 = new ItemSolicitudDeCotizacionDTO();
		i2.setCantidad(5);
		i2.setRodamiento(r2);
		items.add(i2);
		
		dto = getOrSave(dto);
		
		return dto;
	}
	
	public static CotizacionDTO makeCot(SolicitudDeCotizacionDTO scDTO) {
		CotizacionDTO c = new CotizacionDTO();
		String xml = VentasServiceImpl.getInstancia().cotizarSolicitud(scDTO.getId());
		System.out.println(xml);
		return BD.getInstance().getCotizacion(scDTO.getId());
	}

	private static SolicitudDeCotizacionDTO getOrSave(SolicitudDeCotizacionDTO dto) {
		SolicitudDeCotizacionDTO scBD = BD.getInstance().getSolicitudDeCotizacion(dto.getId());
		
		if(scBD==null) {
			BD.getInstance().altaSolicitudDeCotizacion(dto);
			scBD = BD.getInstance().getSolicitudDeCotizacion(dto.getId());
		}
		
		return scBD;
	}

	private static ClienteDTO getOrSave(ClienteDTO dto) {
		ClienteDTO cBD = BD.getInstance().getCliente(dto.getCuil());
		
		if(cBD==null) {
			BD.getInstance().altaCliente(dto);
			cBD = BD.getInstance().getCliente(dto.getCuil());
		}
		
		return cBD;
	}

	private static RodamientoDTO getOrSave(RodamientoDTO dto) {
		RodamientoDTO rBD = BD.getInstance().getRodamiento(dto);
		
		if(rBD==null) {
			BD.getInstance().altaRodamiento(dto);
			rBD = BD.getInstance().getRodamiento(dto);
		}
		
		return rBD;
	}

	private static ListaPrecioDTO getOrSave(ListaPrecioDTO lp) {
		ListaPrecioDTO lpBD = BD.getInstance().getListaPrecio(lp.getIdLista());
		
		if(lpBD==null) {
			BD.getInstance().altaListaPrecio(lp);
			lpBD = BD.getInstance().getListaPrecio(lp.getIdLista());
		}
		
		return lpBD;
	}

	private static ProveedorDTO getOrSave(ProveedorDTO p) {
		ProveedorDTO pBD = BD.getInstance().getProveedor(p.getCuil());
		
		if(pBD==null) {
			BD.getInstance().altaProveedor(p);
			pBD = BD.getInstance().getProveedor(p.getCuil());
		}
		
		return pBD;
	}

	private static OrdenDePedidoDTO getODP() {
		OrdenDePedidoDTO o = new OrdenDePedidoDTO();
		
		ClienteDTO cliente = BD.getInstance().getCliente(12345L);
		o.setCliente(cliente );
		o.setCondicionVenta(cliente.getCondiciones().get(0));
		o.setFecha(new LocalDate().toString(FormatUtils.DATE_FORMATTER));
		List<ItemPedidoDTO> itemsPedido = new LinkedList<>();
		o.setItemsPedido(itemsPedido);
//		
//		ItemPedidoDTO i1 = new ItemPedidoDTO();
//		i1.setCotizacion(cotizacion);
//		i1.setEstado(EstadoItemPedido.PENDIENTE);
//		i1.setItem(item);
		
		o.setNumero(11L);
		
		return o;
	}
}
